home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / othergnu / ispell.zoo / ispell.el < prev    next >
Lisp/Scheme  |  1990-03-06  |  26KB  |  572 lines

  1. ;; ISPELL.EL -- Spelling correction interface for GNU EMACS using "ispell".
  2. ;; Copyright (C) 1988 Ashwin Ram.
  3. ;;
  4. ;; This file is not part of the GNU Emacs distribution (yet).
  5. ;;
  6. ;; This file is distributed in the hope that it will be useful,
  7. ;; but WITHOUT ANY WARRANTY.  No author or distributor
  8. ;; accepts responsibility to anyone for the consequences of using it
  9. ;; or for whether it serves any particular purpose or works at all,
  10. ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  11. ;; License for full details.
  12.  
  13. ;; Everyone is granted permission to copy, modify and redistribute
  14. ;; this file, but only under the conditions described in the
  15. ;; GNU Emacs General Public License.   A copy of this license is
  16. ;; supposed to have been given to you along with GNU Emacs so you
  17. ;; can know your rights and responsibilities.  It should be in a
  18. ;; file named COPYING.  Among other things, the copyright notice
  19. ;; and this notice must be preserved on all copies.
  20.  
  21. (provide 'ispell)
  22.  
  23. ;; Comments, corrections, and improvements should be sent to:
  24. ;;
  25. ;;     Ashwin Ram
  26. ;;
  27. ;;     ARPA:   Ram-Ashwin@cs.yale.edu
  28. ;;     UUCP:   {decvax,ucbvax,harvard,cmcl2,...}!yale!Ram-Ashwin
  29. ;;     BITNET: Ram@yalecs
  30.  
  31.  
  32. ;;; MODIFICATION HISTORY:
  33.  
  34. ;;; Ray Moody       ARPA:    ray@maxwell.physics.purdue.edu
  35. ;;;                 UUCP:    ...!pur-phy!ray
  36. ;;;                 BITNET:  moody@purccvm  (going away soon....)
  37. ;;; Inserted a missing save-excursion in ispell-check-version-compatibility.
  38. ;;; 3/30/89.
  39.  
  40. ;;; Ashwin Ram      ARPA:    Ram-Ashwin@cs.yale.edu
  41. ;;;                 UUCP:    ...!{decvax, linus, seismo}!yale!Ram-Ashwin
  42. ;;;                 BITNET:  Ram@yalecs
  43. ;;; Added flag to allow filters that don't produce single column output.
  44. ;;; 3/20/88.
  45. ;;; Added version compatibility code because of all the confusion.
  46. ;;; 11/19/87.
  47. ;;; Added variable to control embedded word checking (nice in troff but a pain otherwise).
  48. ;;; 10/26/87.
  49. ;;; Interactive word completion.
  50. ;;; 8/14/87.
  51. ;;; Detex before checking spelling.
  52. ;;; Made options more mnemonic, prompt and error messages better.
  53. ;;; Added highlighting of misspelled word.
  54. ;;; Query-replace all occurrences of misspelled word through buffer.
  55. ;;; Allow customization of personal dictionary.
  56. ;;; Moved temporary file to /tmp.
  57. ;;; Added check for dead ispell process to avoid infinite loop.
  58. ;;; Avoid repeated querying for same word in same buffer.
  59. ;;; 7/6/87.
  60.  
  61. ;;; Walt Buehring
  62. ;;; Texas Instruments - Computer Science Center
  63. ;;; ARPA:  Buehring%TI-CSL@CSNet-Relay
  64. ;;; UUCP:  {smu, texsun, im4u, rice} ! ti-csl ! buehring
  65.  
  66. ;;; ispell-region and associated routines added by
  67. ;;; Perry Smith
  68. ;;; pedz@bobkat
  69. ;;; Tue Jan 13 20:18:02 CST 1987
  70.  
  71. ;;; extensively modified by Mark Davies and Andrew Vignaux
  72. ;;; {mark,andrew}@vuwcomp
  73. ;;; Sun May 10 11:45:04 NZST 1987
  74.  
  75. ;;; Depends on the ispell program snarfed from MIT-PREP in early 1986.
  76.  
  77. ;;; CUSTOMIZATION:
  78.  
  79. ;;; To fully install this, add this file to your GNU lisp directory and 
  80. ;;; compile it with M-X byte-compile-file.  Then add the following to the
  81. ;;; appropriate init file:
  82. ;;;     (autoload 'ispell-word "ispell" "Check spelling of word at or before point" t)
  83. ;;;     (autoload 'ispell-complete-word "ispell" "Complete word at or before point" t)
  84. ;;;     (autoload 'ispell-region "ispell" "Check spelling of every word in the region" t)
  85. ;;;     (autoload 'ispell-buffer "ispell" "Check spelling of every word in the buffer" t)
  86.  
  87. ;;; You might want to bind ispell-word and ispell-complete word to keys.
  88. ;;; You might also want to set the ispell customization variables, e.g.:
  89. ;;;     (setq-default ispell-words-have-boundaries t)  ;; To change the default value.
  90. ;;; or, (setq ispell-words-have-boundaries t)          ;; To change a local value (perhaps inside a mode hook).
  91. ;;; Look at variables starting with "ispell-" to see what you get.
  92.  
  93. ;;; If run on a heavily loaded system, the initial sleep time in ispell-init-process
  94. ;;; may need to be increased.
  95.  
  96. ;;; If you count special characters like ' (apostrophe) or - (hyphen) as part of
  97. ;;; a word, set their syntax table entries as follows:
  98. ;;;     (modify-syntax-entry ?' "w   " ispell-syntax-table)
  99. ;;;     (modify-syntax-entry ?- "w   " ispell-syntax-table)
  100. ;;; Similarly, if you don't want something to count as a word character, set its
  101. ;;; syntax entry to ".   ".
  102.  
  103. (defconst ispell-version "2.0.01") ;; Check against output of "ispell -v".
  104.  
  105. (defconst ispell-out-name " *ispell*"
  106.   "Name of the buffer that is associated with the 'ispell' process")
  107.  
  108. (defconst ispell-temp-name " *ispell-temp*"
  109.   "Name of the temporary buffer that 'ispell-region' uses to hold the
  110. filtered region")
  111.  
  112. (defvar ispell-program-name "ispell"
  113.   "*Program invoked by ispell-word and ispell-region commands.")
  114.  
  115. (defvar ispell-dictionary
  116.    nil
  117.    "*Personal dictionary file containing a list of words, one to a line.
  118. If nil, defaults to ispell's normal default (usually ~/.ispell_words).")
  119.  
  120. (defvar ispell-words-have-boundaries t
  121.    "*If nil, a misspelled word matches embedded words too.  This is useful in
  122. nroff/troff, where a misspelled word may be hidded (e.g., \fIword\fB), and a
  123. pain otherwise.")
  124.  
  125. (defvar ispell-highlight nil
  126.    "*If non-nil, misspelled words are highlighted.  See the function highlight-region.")
  127.  
  128. (defvar ispell-syntax-table nil
  129.    "*Syntax table used by ispell to find word boundaries.  You may change syntax
  130. entries to, say, allow ' and - to be part of words, or not, as you prefer.")
  131.  
  132. (if (null ispell-syntax-table)
  133.     ;; The following assumes that the standard-syntax-table
  134.     ;; is static.  If you add words with funky characters
  135.     ;; to your dictionary, the following may have to change.
  136.     (progn
  137.       (setq ispell-syntax-table (make-syntax-table))
  138.       ;; Make certain characters word constituents
  139.       ;; (modify-syntax-entry ?' "w   " ispell-syntax-table)
  140.       ;; (modify-syntax-entry ?- "w   " ispell-syntax-table)
  141.       ;; Get rid on existing word syntax on certain characters 
  142.       (modify-syntax-entry ?0 ".   " ispell-syntax-table)
  143.       (modify-syntax-entry ?1 ".   " ispell-syntax-table)
  144.       (modify-syntax-entry ?2 ".   " ispell-syntax-table)
  145.       (modify-syntax-entry ?3 ".   " ispell-syntax-table)
  146.       (modify-syntax-entry ?4 ".   " ispell-syntax-table)
  147.       (modify-syntax-entry ?5 ".   " ispell-syntax-table)
  148.       (modify-syntax-entry ?6 ".   " ispell-syntax-table)
  149.       (modify-syntax-entry ?7 ".   " ispell-syntax-table)
  150.       (modify-syntax-entry ?8 ".   " ispell-syntax-table)
  151.       (modify-syntax-entry ?9 ".   " ispell-syntax-table)
  152.       (modify-syntax-entry ?$ ".   " ispell-syntax-table)
  153.       (modify-syntax-entry ?% ".   " ispell-syntax-table)))
  154.  
  155.  
  156. (defun ispell-word (&optional quietly)
  157.    "Check spelling of word at or before dot.
  158. If word not found in dictionary, display possible corrections in a window 
  159. and let user select."
  160.    (interactive)
  161.    (let* ((current-syntax (syntax-table))
  162.           start end word poss replace)
  163.       (unwind-protect
  164.             (save-excursion
  165.                (set-syntax-table ispell-syntax-table)            ;; Ensure syntax table is reasonable 
  166.                (if (not (looking-at "\\w"))
  167.                    (re-search-backward "\\w" (point-min) 'stay)) ;; Move backward for word if not already on one
  168.                (re-search-backward "\\W" (point-min) 'stay)      ;; Move to start of word
  169.                (or (re-search-forward "\\w+" nil t)              ;; Find start and end of word
  170.                    (error "No word to check."))
  171.                (setq start (match-beginning 0)
  172.                      end (match-end 0)
  173.                      word (buffer-substring start end)))
  174.          (set-syntax-table current-syntax))
  175.       (ispell-init-process)   ;; erases ispell output buffer
  176.       (or quietly (message "Checking spelling of %s..." (upcase word)))
  177.       (save-excursion
  178.          (set-buffer ispell-out-name)
  179.          (send-string ispell-process (concat word "\n"))
  180.          (while (progn                                         ;; Wait until we have a complete line
  181.                    (goto-char (point-max))
  182.                    (/= (preceding-char) ?\n))
  183.             (accept-process-output ispell-process))
  184.          (goto-char (poi